package com.dc.docs._888_面试.concurrent._9_synchronized;

/**
 * Description: Synchronized 修饰代码块_类（锁的是class对象）
 * @author: gdc
 * @date: 2021/6/17
 * @version 1.0
 */
public class SyncCodeBlock_Class_Demo implements Runnable{
    /**
     * 资源
     */
    private static int num = 0;

    /**
     * 静态方法
     */
    public static void increase(){
        num++;
    }

    /**
     * 实例方法
     */
    public void increase4Obj(){
        num++;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10000; i++) {
            // synchronized 修饰 class对象，当多个线程操作该类中的静态方法和资源，将处于加锁状态
            synchronized (SyncCodeBlock_Class_Demo.class) {
                // 操作静态方法
                increase();

                // 操作实例方法
                increase4Obj();
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        SyncCodeBlock_Class_Demo obj1 = new SyncCodeBlock_Class_Demo();
        SyncCodeBlock_Class_Demo obj2 = new SyncCodeBlock_Class_Demo();

        /**
         * 两个线程操作两个不同的实例
         *
         * 由于 synchronized 修饰的是class对象。
         * 因此即使操作不同的对象实例，返回的结果依然正确
         */
        Thread thread1 = new Thread(obj1);
        Thread thread2 = new Thread(obj2);

        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();

        System.out.println(num);
    }
}
